﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;

namespace ImobitechDao.Repositories
{
    public class ContasRepository : BaseRepository<Contas>, IContasRepository
    {

        #region Implementação obrigatoria da classe base
        public ContasRepository(ImobitechEntities context) : base(context) { }

        protected override string TableName
        {
            get { return "Contas"; }
        }

        protected override string EntitySetName
        {
            get { return "Contas"; }
        }
        #endregion

        public List<Tuple<decimal, decimal, decimal, int>> retornaFluxoCaixa(int mes, List<CategoriaConta> categorias, int tipo)
        {
            //Tuple<decimal, decimal, decimal> retorno = new Tuple<decimal, decimal, decimal>();
            return (from c in _context.Contas
                    join p in _context.ParcelaConta on c.Id equals p.Contas.Id
                    where p.Dt_vencimento.Month == mes && c.St_tipo == tipo
                    select new Tuple<decimal, decimal, decimal, int>
                    (
                        p.Valor,
                        p.Acrescimo,
                        p.Desconto,
                        c.CategoriaConta.Id
                    )).ToList();
        }

        public List<fluxoCaixa> retornaFluxoCaixa(int mes, int ano, int categoria, int tipo)
        {
            IQueryable<fluxoCaixa> retorno =
                (from c in _context.Contas
                 join p in _context.ParcelaConta on c.Id equals p.Contas.Id
                 select new fluxoCaixa
                 {
                     valor = p.Valor,
                     acrescimo = p.Acrescimo,
                     desconto = p.Desconto,
                     vencimento = p.Dt_vencimento,
                     pago = p.St_Pago,
                     id = c.Id,
                     descricao = c.descricao, 
                     idCategoria = c.CategoriaConta.Id, 
                     tipo = c.St_tipo
                 }).AsQueryable();

            retorno = retorno.Where(p => p.vencimento.Month == mes);
            retorno = retorno.Where(p => p.vencimento.Year == ano);
            retorno = retorno.Where(p => p.tipo == tipo);

            if (categoria > 0)
                retorno = retorno.Where(p => p.idCategoria == categoria);
            
            return retorno.ToList();
        }
    }
}